package xaj.scc.ast;

import java.io.IOException;
import java.io.StringReader;

import xaj.scc.AbcExtension;
import xaj.scc.util.mapping.AddGrammar;
import xaj.scc.util.mapping.Mapping;
import xaj.scc.util.mapping.errorMapping;


import polyglot.lex.EOF;
import polyglot.lex.Operator;
import polyglot.lex.Token;

public class ProductionElementOld_c /*implements ProductionElement*/ {
	
	/**
	 * Nome do s�mbolo n�o terminal utilizado
	 */
	private String name;
	
	/**
	 * Nome da vari�vel associada ao s�mbolo (opcional)
	 */
	private String qualified;
	
	/**
	 * Indica se possui nome de vari�vel associada
	 */
	private boolean isQualifed;
	
	/**
	 * Indica se � um literal
	 */
	private boolean isLiteral;
	
	
	/**
	 * Mapeamento de termos,simbolos
	 * 
	 */
	static Mapping mapeamento;
	/**
	 * Erros ocorridos na busca de termos ou simbolos
	 */
	static errorMapping erro;
	
	public ProductionElementOld_c(String name, String qualified) {
		this.name = name;
		this.qualified = qualified;
		isQualifed = true;
		isLiteral = false;
	}

	public ProductionElementOld_c(String name, boolean literal) {
		this.name = name;
		this.qualified = null;
		isQualifed = false;
		isLiteral = true;
	}
	
	public String getQualifed() {
		return qualified;
	}

	public String getElementName() {
		return name;
	}

	public boolean isLiteral() {
		return isLiteral;
	}
	
	public boolean isQualified() {
		return isQualifed;
	}

	public String toString() {
		String p = "";
		mapeamento = Mapping.getInstance();
		erro = errorMapping.getInstance();
		
		if(isLiteral) {
			int codigo = 0;
			StringReader reader = new StringReader(getElementName());
			
			//Não usar esse construtor
			//abc.syntaxclass.parse.Lexer_c lexer =
			//	new abc.syntaxclass.parse.Lexer_c(reader);
			xaj.scc.parse.Lexer_c lexer = 
				new xaj.scc.parse.Lexer_c(reader, null, null);
			try {
				while (true) {
					Token t = lexer.nextToken();
					if (t instanceof EOF) {
						break;
					}
					
					codigo = t.symbol().sym;
					if(!mapeamento.symbol.containsKey(codigo))
						erro.sentError(Integer.toString(codigo), "ProductionElement_c.java");
					
					p += mapeamento.symbol.get(codigo)+" ";
					
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		} else {
			
			mapeamento = Mapping.getInstance();
			erro = errorMapping.getInstance();
			
			/**
			 * Código alterado por Leonardo
			 */
			
			/*AddGrammar grammar = AddGrammar.getInstance();			
			//Tem que verificar se não é um não-terminal criado pelo usuário
			//Ainda está com problema quando é uma extensão definida em outra syntax class
			if(!mapeamento.nonTerms.containsKey(getElementName()) && 
								!mapeamento.terms.containsKey(getElementName()) &&
								!grammar.containsNonTermianl(getElementName()))
				erro.sentError(getElementName(), "ProductionElement_c");
			*/
			/**
			 * Alterado até esse ponto
			 */
			
			if(isQualified()) {
				
				p = getElementName() + " : " + getQualifed();
				
			} else {
				p = getElementName();
			}
		}		
		return p;
	}

}
